﻿package com.zouloux.physics
{
	import com.zouloux.physics.PhysicsEngine;
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	
	/**
	 * ...
	 * @author ZoulouX
	 */
	public class APhysicsObject extends MovieClip implements IPhysicsObject
	{
		// L'environnement physique
		protected var _engine				:PhysicsEngine;
		
		// Les vélocités
		protected var _velocityX			:Number 			= 0;
		protected var _velocityY			:Number 			= 0;
		
		// La masse
		protected var _weight				:Number				= 1;
		
		// La friction
		protected var _friction				:Number				= 0.4;
		
		// Si on est en train de déplacer l'objet avec la souris
		protected var _mouseDragging		:Boolean			= false;
		
		// Le point de déplacement
		protected var _baseDragPoint		:Point				= new Point();
		
		// Le point des anciennes coordonnées
		protected var _oldPoint				:Point				= new Point();
		
		// Spécifier si le moteur physique est actif
		protected var _physicEnabled		:Boolean			= true;
		
		
		// Les getters
		public function get velocityX():Number
		{
			return _velocityX;
		}
		public function get velocityY():Number
		{
			return _velocityY;
		}
		public function get weight():Number
		{
			return _weight;
		}
		public function get friction():Number
		{
			return _friction;
		}
		public function get engine():PhysicsEngine
		{
			return _engine;
		}
		public function get speed ():Number
		{
			return Math.sqrt(velocityX * velocityX + velocityY * velocityY);
		}
		public function get physicEnabled():Boolean
		{
			return _physicEnabled;
		}
		
		
		// Les setters
		public function set velocityX(value:Number):void 
		{
			_velocityX = value;
		}
		public function set velocityY(value:Number):void 
		{
			_velocityY = value;
		}
		public function set weight(value:Number):void 
		{
			_weight = value;
		}
		public function set friction(value:Number):void 
		{
			_friction = value;
		}
		public function set engine(value:PhysicsEngine):void 
		{
			_engine = value;
		}
		public function set physicEnabled(value:Boolean):void 
		{
			_physicEnabled = value;
		}
		
		
		// Actualiser la position
		public function update ():void
		{
			// Vérifier si on est en train de le déplacer avec la souri
			if (_mouseDragging)
			{
				// L'ancienne position pour calculer les vélocités
				_oldPoint.x = x;
				_oldPoint.y = y;
				
				// On place l'objet au point du curseur
				x -= (x - (engine.mouseX - _baseDragPoint.x)) / 4;
				y -= (y - (engine.mouseY - _baseDragPoint.y)) / 4;
				
				// On recalcule les vélocités
				_velocityX = x - _oldPoint.x;
				_velocityY = y - _oldPoint.y;
			}
			else
			{
				// Appliquer les frictions
				_velocityX /= (_friction / 10) + 1;
				_velocityY /= (_friction / 10) + 1;
				
				// Appliquer la gravité
				_velocityY += engine.gravity;
				
				// Appliquer les vélocités
				x += _velocityX;
				y += _velocityY;
			}
		}
		
		// On commence le déplacement de l'élément avec la souris
		public function startMouseDrag (event:Event = null):void
		{
			// On enregistre le point de référence du curseur
			_baseDragPoint.x = engine.mouseX - x;
			_baseDragPoint.y = engine.mouseY - y;
			
			// On déplace maintenant avec la souris
			_mouseDragging = true;
		}
		
		// On arrête de déplacer l'éléments
		public function stopMouseDrag (event:Event = null):void
		{
			_mouseDragging = false;
		}
		
		// Vérifier la collision avec un autre objet
		public function checkCollisionWidth (pPhysicsObject:IPhysicsObject):void
		{
		}
	}
}